#ifndef TRACK_TRACKER_H_
#define TRACK_TRACKER_H_

#include <Eigen/Core>
#include <Eigen/Dense>
#include <memory>

namespace autodrive {
namespace perception {

/// @brief declare map
struct Map;
struct RoadMarkingResult;
struct RoadMarkingResultSet;
class Postprocessor;
struct MapTrackParameter;

class Tracker {
 public:
  Tracker();
  ~Tracker();

  /// @brief main run function
  /// @param void
  /// @return void
  void Init(const std::string& config_path);

  /// @brief main run function
  /// @param void
  /// @return void
  void Run(autodrive::perception::Map& map, const Eigen::Affine3d& pos,
           RoadMarkingResultSet& output_roadmarking);

 private:
  /// @brief post processor object
  std::unique_ptr<Postprocessor> turn_processor;
  std::unique_ptr<Postprocessor> crosswalk_processor;
  std::unique_ptr<Postprocessor> nostop_processor;

  ///@brief settings
  std::shared_ptr<MapTrackParameter> settings_ptr_;
};
}  // namespace perception
}  // namespace autodrive

#endif